#include <stdio.h>
#include <string.h>
#include "operation.h"
#include "message.h"
#include "driver_servo.h"
#include "driver_led.h"

// 窗户的操作处理数组 - 定义了窗户支持的操作及其处理函数
OperationHandler window_operations[] = {
    {"open", open_window},
    {"close", close_window}};

// 实体处理数组 - 存储系统支持的所有实体及其操作
EntityHandler entity_handlers[] = {
    {"door", window_operations, sizeof(window_operations) / sizeof(window_operations[0])}};

/**
 * 处理消息的核心函数
 * 根据消息中的实体和操作类型，调用对应的处理函数
 * @param msg 包含实体和操作信息的消息结构
 * @return 如果找到并执行了对应操作，返回操作结果；否则返回false
 */
bool handle_message(const MessageKeyValue *msg)
{
    size_t num_entities = sizeof(entity_handlers) / sizeof(entity_handlers[0]);

    // 遍历所有支持的实体
    for (size_t i = 0; i < num_entities; i++)
    {
        // 找到匹配的实体
        if (strcmp(msg->key, entity_handlers[i].entity) == 0)
        {
            // 遍历该实体支持的所有操作
            for (size_t j = 0; j < entity_handlers[i].num_operations; j++)
            {
                // 找到匹配的操作
                if (strcmp(msg->value, entity_handlers[i].operations[j].operation) == 0)
                {
                    // 执行对应的操作函数并返回结果
                    return entity_handlers[i].operations[j].action();
                }
            }
        }
    }

    // 未找到匹配的实体或操作
    return false;
}
